// Keywords: migration, dispersal

initialize() {
	initializeMutationRate(1e-7);
	initializeMutationType("m1", 0.5, "f", 0.0);
	initializeMutationType("m2", 1.0, "f", 0.5);  // introduced mutation
	initializeGenomicElementType("g1", m1, 1.0);
	initializeGenomicElement(g1, 0, 99999);
	initializeRecombinationRate(1e-8);
}
1 early() {
	sim.setValue("FST", 0.0);
	sim.addSubpop("p1", 500);
	sim.addSubpop("p2", 500);
	p1.setMigrationRates(p2, 0.1);
	p2.setMigrationRates(p1, 0.1);
}
1000 late() {
	target = sample(p1.haplosomes, 1);
	target.addNewDrawnMutation(m2, 10000);
}
mutationEffect(m2, p2) { return 0.2; }
2000: early() {
	// tag all individuals with their m2 mutation count
	inds = sim.subpopulations.individuals;
	inds.tag = inds.countOfMutationsOfType(m2);
	
	// precalculate the mating weights vectors
	for (subpop in c(p1,p2))
	{
		has_m2 = (subpop.individuals.tag > 0);
		subpop.setValue("weights1", ifelse(has_m2, 2.0, 1.0));
		subpop.setValue("weights2", ifelse(has_m2, 0.5, 1.0));
	}
}
2000: mateChoice() {
	if (individual.tag > 0)
		return weights * sourceSubpop.getValue("weights1");
	else
		return weights * sourceSubpop.getValue("weights2");
}
10000: late() {
	FST = calcFST(p1.haplosomes, p2.haplosomes);
	sim.setValue("FST", sim.getValue("FST") + FST);
}
19999 late() {
	cat("Mean FST at equilibrium: " + (sim.getValue("FST") / 10000));
	sim.simulationFinished();
}
